﻿Imports WiremetModel.Entities.OEM
Imports WiremetModel.Entities

Public Class ZamowieniaKlientaReportService

    Public Function GenerateReport(ByVal klient As Klient, ByVal dateLowerBoundary As Date, ByVal dateUpperBoundary As Date) As ZamowieniaKlientaReport

        Dim unitOfWork As New UnitOfWork()
        Dim dateRangeSpecification As New GeneralSpecifications.DateRangeSpecification(Of OEM.Wysylka)(dateLowerBoundary, dateUpperBoundary)
        Dim wysylkiRepository As New Repository(Of OEM.Wysylka)(unitOfWork)
        Dim wysylki As IEnumerable(Of OEM.Wysylka) = wysylkiRepository.GetAllMatching(dateRangeSpecification).Where(Function(x) x.Zlecenie.Klient.Id = klient.Id)
        Dim druty As IEnumerable(Of Tracking.Drut) = wysylki.SelectMany(Function(x) x.PaczkiWysylki.SelectMany(Function(y) y.Druty.Select(Function(z) z.Drut)))

        Dim drutGroupedByStop As New Dictionary(Of [Stop], ZamowieniaKlientaReportDataRow)
        Dim opakowanieCount As New Dictionary(Of Pakowanie, PakowanieSubreportDataRow)
        For Each drut As Tracking.Drut In druty
            Dim melt As [Stop] = drut.PozycjaSchematu.Schemat.PozycjaZlecenia.Gatunek.Stop
            Dim weight As Decimal = CDec(drut.Kontrola.First().Ilosc)
            Dim opakowanie As Pakowanie = drut.Kontrola.First().Pakowanie

            If Not drutGroupedByStop.ContainsKey(melt) Then
                drutGroupedByStop.Add(melt, New ZamowieniaKlientaReportDataRow With {.Melt = melt, .Weight = 0, .SpoolCount = 0})
            End If

            drutGroupedByStop(melt).Weight += weight
            drutGroupedByStop(melt).SpoolCount += 1

            If Not opakowanieCount.ContainsKey(opakowanie) Then
                opakowanieCount.Add(opakowanie, New PakowanieSubreportDataRow With {.Nazwa = opakowanie.Nazwa, .Ilosc = 0})
            End If

            opakowanieCount(opakowanie).Ilosc += 1
        Next


        Dim zamowieniaKlientaReport As New ZamowieniaKlientaReport()
        zamowieniaKlientaReport.OpenSubreport("PakowanieKlientSubreport").SetDataSource(opakowanieCount.Values.OrderByDescending(Function(x) x.Ilosc))
        zamowieniaKlientaReport.OpenSubreport("MaterialyKlientSubreport").SetDataSource(drutGroupedByStop.Values.OrderByDescending(Function(x) x.Weight))
        'zamowieniaKlientaReport.SetDataSource(drutGroupedByStop.Values.OrderByDescending(Function(x) x.Weight))
        zamowieniaKlientaReport.SetParameterValue("p_klient_nazwa_skrocona", klient.NazwaSkrocona)
        zamowieniaKlientaReport.SetParameterValue("p_klient_nazwa_pelna", klient.NazwaPelna)
        zamowieniaKlientaReport.SetParameterValue("p_klient_ulica", klient.Ulica)
        zamowieniaKlientaReport.SetParameterValue("p_klient_numer", klient.Numer)
        zamowieniaKlientaReport.SetParameterValue("p_klient_kod_pocztowy", klient.KodPocztowy)
        zamowieniaKlientaReport.SetParameterValue("p_klient_miejscowosc", klient.Miejscowosc)
        zamowieniaKlientaReport.SetParameterValue("p_klient_kraj", klient.Kraj)
        zamowieniaKlientaReport.SetParameterValue("p_klient_telefon", klient.Telefon)
        zamowieniaKlientaReport.SetParameterValue("p_klient_email", klient.Email)
        zamowieniaKlientaReport.SetParameterValue("p_klient_nip", klient.Nip)
        zamowieniaKlientaReport.SetParameterValue("p_klient_uwagi", IIf(klient.Uwagi Is Nothing, String.Empty, klient.Uwagi))
        zamowieniaKlientaReport.SetParameterValue("p_date_lower_bound", dateLowerBoundary)
        zamowieniaKlientaReport.SetParameterValue("p_date_upper_bound", dateUpperBoundary)


        Return zamowieniaKlientaReport

    End Function

End Class
